package Api.BigDecimal;

import java.math.BigDecimal;
import java.math.RoundingMode;

/*
* BigDecimal类-->保证不丢失精度，同时还可以保留指定的小数位，适用于货币运算
* */
public class Demo {
    public static void main(String[] args) {
        //浮点数运算的精度丢失
        /*System.out.println(0.1 + 0.2);//0.30000000000000004
        System.out.println(1.301 / 100);//0.013009999999999999*/
        // 1、把浮点型数据封装成BigDecimal对象，再来参与运算。
        // a、public BigDecimal(double val) 得到的BigDecimal对象是无法精确计算浮点型数据的。 注意：不推荐使用这个，
        // b、public BigDecimal(String val)  得到的BigDecimal对象是可以精确计算浮点型数据的。 可以使用。
        // c、public static BigDecimal valueOf(double val): 通过这个静态方法得到的BigDecimal对象是可以精确运算的。是最好的方案
        double a = 0.2;
        double b = 0.1;
        BigDecimal a1 = BigDecimal.valueOf(a);
        BigDecimal b1 = BigDecimal.valueOf(b);
        System.out.println(a+"  "+b);
        BigDecimal rs1 = a1.add(b1);//加法
        System.out.println("加法:"+rs1);
        BigDecimal rs2 = a1.multiply(b1);//乘法
        System.out.println("乘法:"+rs2);
        BigDecimal rs3 = a1.divide(b1);//除法--》遇到除不尽的时候，会抛异常
        System.out.println("除法:"+rs3);
        BigDecimal rs4 = a1.divide(b1,2, RoundingMode.HALF_UP);//参数：BigDecimal对象，精度，舍入模式
        System.out.println("除法:"+rs4);
        BigDecimal rs5 = a1.subtract(b1);//减法
        System.out.println("减法:"+rs5);
        //-------------------------------------------
        //doubleValue()方法 转换为double类型
        double r5=rs5.doubleValue();
        System.out.println(r5);
    }
}
